#include "qextserialthread.h"

QextSerialThread::QextSerialThread(QString port, SerialPort *parent):
    QThread(parent),mPort(port)
{
    qextIsCreate = false;


}

/*******************************************
  功能：设置端口
  参数：port:名称
  返回值：
  ******************************************/
void QextSerialThread::setPort(const QString& port)
{
    mPort = port;
}

/*******************************************
  功能：是否已经打开
  参数：
  返回值：返回是否打开状态
  ******************************************/
bool QextSerialThread::isOpen() const
{
     if (!qextIsCreate)
     {
         return false;
     } else {
         return serialPort->isOpen();
     }
}

/*******************************************
  功能：是否可读
  参数：
  返回值：返回是否可读状态
  ******************************************/
bool QextSerialThread::isReadable() const
{
    if (!qextIsCreate)
    {
        return false;
    } else {
        return serialPort->isReadable();
    }
}

/*******************************************
  功能：是否可写
  参数：
  返回值：返回是否可写状态
  ******************************************/
bool QextSerialThread::isWritable() const
{
    if (!qextIsCreate)
    {
        return false;
    } else {
        return serialPort->isWritable();
    }
}

/*******************************************
  功能：设置读取信息的间隔时间
  参数：timeSize:间隔时间
  返回值：
  ******************************************/
void QextSerialThread::setReadTime(int timeSize)
{
    mTimeSize = timeSize;
}

/*******************************************
  功能：设置 串口波特率
  参数：baudRateType,串口波特率
  返回值：
  ******************************************/
void QextSerialThread::setBaudRate(BaudRateType baudRate)
{
    mPortSettings.BaudRate = baudRate;
    serialPort->setBaudRate(baudRate);
}


/*******************************************
  功能：设置 串口停止位
  参数：stopBits,串口停止位
  返回值：
  ******************************************/
void QextSerialThread::setStopBits(StopBitsType stopBits)
{
    mPortSettings.StopBits = stopBits;
    serialPort->setStopBits(stopBits);
}

/*******************************************
  功能：设置 串口数据位
  参数：dataBitsType,串口数据位
  返回值：
  ******************************************/
void QextSerialThread::setDataBits(DataBitsType dataBits)
{
    mPortSettings.DataBits = dataBits;
    serialPort->setDataBits(dataBits);
}


/*******************************************
  功能：设置 串口奇偶验证位
  参数：parityType,串口奇偶验证位
  返回值：
  ******************************************/
void QextSerialThread::setParity(ParityType parityType)
{
    mPortSettings.Parity = parityType;
    serialPort->setParity(parityType);
}

/*******************************************
  功能：设置 串口数据流控件
  参数：flowType,串口数据流控件
  返回值：
  ******************************************/
void QextSerialThread::setFlowControl(FlowType flowCtl)
{
    mPortSettings.FlowControl = flowCtl;
    serialPort->setFlowControl(flowCtl);
}

void QextSerialThread::setTimeout(long time)
{
    mPortSettings.Timeout_Millisec = time;
    serialPort->setTimeout(time);
}

/*******************************************
  功能：开始运行，一般调用start()之后，就会运行此函数
  参数：
  返回值：
  ******************************************/
void QextSerialThread::run()
{

#ifdef _TTY_WIN_   //for win
    serialPort = new Win_QextSerialPort(mPort, mPortSettings);
#else
    serialPort = new Posix_QextSerialPort(mPort, mPortSettings);
#endif

    QTimer readTimer;
    connect(&readTimer, SIGNAL(timeout()), this, SLOT(timeToRead()));

    serialPort->open(QIODevice::ReadWrite);
    serialPort->readAll();

    qextIsCreate = true;
    readTimer.start(mTimeSize);

    if (exec()){
        readTimer.stop();
    }
}


/*******************************************
  功能：通过串口配置结构体设置串口基本设置
  参数：
  返回值：
  ******************************************/
void QextSerialThread::setPortSettings(PortSettings portSettings)
{
    mPortSettings = portSettings;
}

/*******************************************
  功能：控制DTR,低位接收形式，置位的时候会有一定的时间间隔
  参数：
  返回值：
  ******************************************/
void QextSerialThread::setDtr(bool set)
{
    isOpenDtr = set;
    if (!qextIsCreate)
    {
        return;
    } else {
        serialPort->setDtr(set);
    }
}

/*******************************************
  功能：控制RTS，高位发送命令形式，低位接收形式，置位的时候会有一定的时间间隔
  参数：portSettings,串口结构体，存贮串口最基本的设置
  返回值：
  ******************************************/
void QextSerialThread::setRts(bool set)
{
    isOpenRts = set;
    if (!qextIsCreate)
    {
        return;
    } else {
        serialPort->setRts(set);
    }
}

/*******************************************
  功能：打开串口，打开后串口正式可以接收和发送数据
  参数：openMode,打开方式，跟打开文件方式一样，可读可写等
  返回值：
  ******************************************/
bool QextSerialThread::openSeriPort(QIODevice::OpenMode openMode)
{
    serialPort->setBaudRate(mPortSettings.BaudRate);
    serialPort->setDataBits(mPortSettings.DataBits);
    serialPort->setParity(mPortSettings.Parity);
    serialPort->setStopBits(mPortSettings.StopBits);
    serialPort->setFlowControl(mPortSettings.FlowControl);
    serialPort->setTimeout(mPortSettings.Timeout_Millisec);



//    readTimer->start(mTimeSize);
    bool flag = serialPort->open(openMode);

    serialPort->readAll();

    return flag;
}

/*******************************************
  功能：关闭串口
  参数：
  返回值：
  ******************************************/
void QextSerialThread::closeSeriPort()
{
    if (!qextIsCreate)
    {
        return;
    } else {
//        readTimer->stop();
        serialPort->close();
    }
}

/*******************************************
  功能：槽函数，读取串口中收到的数据，并将收到的数据发送出去
  参数：
  返回值：
  ******************************************/
void QextSerialThread::timeToRead()
{
//    readTimer->start(mTimeSize);

    if (serialPort->isOpen())
    {
        mReceBytes = serialPort->readAll();
    }


    if (!mReceBytes.isEmpty())
    {
        emit receBytes(mReceBytes);
    }
}

/*******************************************
  功能：发送数据槽函数，将数据发送出去
  参数：sendBytes,要发送的数据
  返回值：
  ******************************************/
qint64 QextSerialThread::sentByteSlot(QByteArray sendBytes) const
{
    return serialPort->write(sendBytes);

}

/*******************************************
  功能：串口已经打开了，改变串口读取数据的间隔时间槽函数
  参数：timeSize,依旧为间隔时间，单位：毫秒
  返回值：
  ******************************************/
void QextSerialThread::changeReceTimeAtRunning(int timeSize)
{
    mTimeSize = timeSize;
//    readTimer->stop();
//    readTimer->start(timeSize);
}
